package br.com.it4.framework.persistence.dao;

import br.com.it4.framework.persistence.exception.PersistenceException;

/**
 * Interface para a classe de manipulação básica para uma determinada entidade.
 * 
 * @author Mozart Silva (mozart.vsilva@gmail.com)
 * 
 * @param <T>
 *            A entidade generica a ser manipulada na persistência.
 */
public interface BaseDAO<T> {

    /**
     * Utilizado para salvar um objeto.
     * 
     * @param object
     *            A entidade a ser salva.
     * @return A entidade persistida.
     * @throws PersistenceException
     *             Caso ocorra erro na persistência.
     */
    public abstract T add(T object) throws PersistenceException;

    /**
     * Utilizado para atualizar um persistido.
     * 
     * @param object
     *            O objeto a ser atualizado.
     * @return A entidade persistida.
     * @throws PersistenceException
     *             Caso ocorra erro na persistência.
     */
    public abstract T update(T object) throws PersistenceException;

    /**
     * Utilizado para remover um objeto persistido.
     * 
     * @param object
     *            Objeto a ser removido.
     * @throws PersistenceException
     *             Caso ocorra erro na persistência.
     */
    public abstract void remove(T object) throws PersistenceException;

    /**
     * Utilizado para recupera um objeto persistido.
     * 
     * @param primaryKey
     *            A chave primária da entidade a ser recuperada.
     * @return A entidade persistida.
     * @throws PersistenceException
     *             Caso ocorra erro na persistência.
     */
    public abstract T get(Object primaryKey) throws PersistenceException;
}
